今天是第12天,還在Pandas....,主要是介紹Pandas裡面資料合併,Pandas學習的時間比我想中還長
ironman1 = pd.Series(['A','B','C'], index=[0,1,2])
ironman2 = pd.Series(['D','E','F'], index=[2,3,4])
pd.concat([ironman1,ironman2])
# 輸出結果,可以看到有重複的index->2
0 A
1 B
2 C
2 D
3 E
4 F
dtype: object
示範用DataFrame串接資料
# 先定義一個function
def make_dataFrame(cols, ind):
data = {c:[str(c) + str(i) for i in ind]
for c in cols}
return pd.DataFrame(data, ind)
ironman3 = make_dataFrame('AB',[1,2])
ironman4 = make_dataFrame('AB',[3,4])
pd.concat([ironman3,ironman4])
# 輸出結果
A B
1 A1 B1
2 A2 B2
3 A3 B3
4 A4 B4
合併資料可採取使用join,outer->聯集、inner->交集(如果資料不存在時有NaN時)
ironman5 = make_dataFrame('BC',[3,4])
print(ironman3)
print(ironman5)
print(pd.concat([ironman3,ironman5], join='inner'))
# 輸出結果,因為ironman3沒有columns C 而 ironman5沒有columns A,所以使用inner(交集)合併時,只會留下columns B
A B
1 A1 B1
2 A2 B2
B C
3 B3 C3
4 B4 C4
B
1 B1
2 B2
3 B3
4 B4
ironman1.append(ironman2)
# 輸出結果
0 A
1 B
2 C
2 D
3 E
4 F
dtype: object
*merge: 也是合併資料的一種,但可以有更多的應用ex: join
ironman6 = pd.DataFrame({'player':['彭政閔','林智勝','郭阜林','詹子賢'],
'number':[23,32,5,39]})
ironman7 = pd.DataFrame({'player':['彭政閔','郭阜林','林智勝','詹子賢'],
'team':['兄弟象','統一獅','兄弟象','兄弟象']})
ironman8 = pd.merge(ironman6, ironman7)
ironman8
# 輸出結果
player number team
0 彭政閔 23 兄弟象
1 林智勝 32 兄弟象
2 郭阜林 5 統一獅
3 詹子賢 39 兄弟象
多對一join
ironman9 = pd.DataFrame({'team':['兄弟象','統一獅','lamigo','富邦悍將'],
'manager':['Snyder','黃甘霖','洪一中','陳連宏']})
ironman10 = pd.merge(ironman8, ironman9)
ironman10
# 輸出結果
player number team manager
0 彭政閔 23 兄弟象 Snyder
1 林智勝 32 兄弟象 Snyder
2 詹子賢 39 兄弟象 Snyder
3 郭阜林 5 統一獅 黃甘霖
多對多join
ironman11 = pd.DataFrame({'team':['兄弟象','兄弟象','統一獅','lamigo','富邦悍將'],
'coach':['伯 納','丘昌榮','高政華','吳俊良','林宗男']})
ironman12 = pd.merge(ironman8, ironman11)
ironman12
# 輸出結果
player number team coach
0 彭政閔 23 兄弟象 伯 納
1 彭政閔 23 兄弟象 丘昌榮
2 林智勝 32 兄弟象 伯 納
3 林智勝 32 兄弟象 丘昌榮
4 詹子賢 39 兄弟象 伯 納
5 詹子賢 39 兄弟象 丘昌榮
6 郭阜林 5 統一獅 高政華
當兩邊index不一樣時可以使用left_on和right_on來指定merge的index
ironman6 = pd.DataFrame({'player':['彭政閔','林智勝','郭阜林','詹子賢'],
'number':[23,32,5,39]})
ironman13 = pd.DataFrame({'name':['彭政閔','郭阜林','林智勝','詹子賢'],
'team':['兄弟象','統一獅','兄弟象','兄弟象']})
pd.merge(ironman6, ironman13, left_on="player", right_on="name").drop('name',axis=1)
# 輸出結果,將重複的column「name」使用drop語法刪除。
player number team
0 彭政閔 23 兄弟象
1 林智勝 32 兄弟象
2 郭阜林 5 統一獅
3 詹子賢 39 兄弟象
在merge中使用inner(交集)、outer(聯集)、lqft(左),(right)右
ironman6 = pd.DataFrame({'player':['彭政閔','林智勝','郭阜林','詹子賢'],
'number':[23,32,5,39]})
ironman14 = pd.DataFrame({'player':['彭政閔','林智勝','張志豪',"藍寅倫"],
'team':['兄弟象','兄弟象','兄弟象','lamigo']})
pd.merge(ironman6, ironman14, how="outer")
# 輸出結果(缺失的資料用NaN帶入)
player number team
0 彭政閔 23.0 兄弟象
1 林智勝 32.0 兄弟象
2 郭阜林 5.0 NaN
3 詹子賢 39.0 NaN
4 張志豪 NaN 兄弟象
5 藍寅倫 NaN lamigo
當欄位名稱相同時使用suffixes來改變欄位名稱
ironman6 = pd.DataFrame({'player':['彭政閔','林智勝','陳江和','張正偉'],
'number':[23,32,31,8]})
ironman15 = pd.DataFrame({'player':['彭政閔','林智勝','陳江和','張正偉'],
'number':[23,31,8,59]})
pd.merge(ironman6,ironman15, on="player", suffixes=["_職棒","_國家隊"])
# 輸出結果(缺失的資料用NaN帶入)
player number_職棒 number_國家隊
0 彭政閔 23 23
1 林智勝 32 31
2 陳江和 31 8
3 張正偉 8 59